#include <iostream>

//C++98不能拷贝的类
//class A
//{
//public:
//	A(int a):_a(a){}
//
//private:
//	A(const A& aa);
//	A& operator=(const A& aa);
//	int _a = 10;
//};
//C++11不能拷贝的类
//class A
//{
//public:
//	A(int a):_a(a){}
//
//	A& operator=(const A& aa) = delete;
//	A(const A& aa) = delete;
//	int _a;
//};
//
//int main()
//{
//	A a1(1);
//	A a2(a1);
//	return 0;
//}


//只能在堆上创建的类，所有构造 or 赋值私有，新接口强制堆上创建
//class HeapOnly
//{
//public:
//	static HeapOnly* CreateObj()
//	{
//		return new HeapOnly(int(),int());
//	}
//	HeapOnly(const HeapOnly& hp) = delete;
//	HeapOnly& operator=(HeapOnly& hp) = delete;
//protected:
//	HeapOnly(int x , int y) : _x(x) , _y(y)
//	{}
//	int _x;
//	int _y;
//};
//
//int main()
//{
//	//HeapOnly hp;//编译报错
//	//HeapOnly hp_temp(hp);//编译报错
//
//	HeapOnly* hp = HeapOnly::CreateObj();
//	return 0;
//}


//只能在栈上创建对象的类，重载operator new，强制栈上生成对象的新接口
//class StackOnly
//{
//public:
//	static StackOnly CreateObj()
//	{
//		return StackOnly();
//	}
//
//	void* operator new(size_t n) = delete;
//protected:
//	StackOnly(int x = 0, int y = 0) :_x(x), _y(y) {}
//	StackOnly(const StackOnly& st)
//	{
//		_x = st._x;
//		_y = st._y;
//	}
//	int _x;
//	int _y;
//};
//
//int main()
//{
//	//StackOnly* st = new StackOnly;
//	StackOnly st = StackOnly::CreateObj();
//	return 0;
//}



//class HeapOnly
//{
//public:
//	static HeapOnly* CreateObj()
//	{
//		return new HeapOnly(int(),int());
//	}
//	HeapOnly(const HeapOnly& hp) = delete;
//	HeapOnly& operator=(HeapOnly& hp) = delete;
//protected:
//	HeapOnly(int x , int y) : _x(x) , _y(y)
//	{}
//	int _x;
//	int _y;
//};
//只能在堆上创建的类，析构函数私有，提供新接口用于析构
//class HeapOnly
//{
//public:
//	static HeapOnly* CreateObj()
//	{
//		return new HeapOnly;
//	}
//	void DestoryObj()
//	{
//		delete this;
//	}
//	
//protected:
//	~HeapOnly()
//	{
//		std::cout << "delete " << std::endl;
//	}
//	HeapOnly(int x=0, int y=0) : _x(x),_y(y){}
//	int _x;
//	int _y;
//};
//int main()
//{
//	HeapOnly* hp = HeapOnly::CreateObj();
//	hp->DestoryObj();
//	return 0;
//}


//单例：饿汉
//namespace hunger
//{
//	class Singleton
//	{
//	public:
//		static Singleton& GetInstance()
//		{
//			std::cout << "Get Instance" << std::endl;
//			return _sint;
//		}
//	protected:
//		Singleton(int x = 0, int y = 0) : _x(x), _y(y)
//		{
//			std::cout << "Create Instance" << std::endl;
//		}
//		int _x;
//		int _y;
//		static Singleton _sint;
//	};
//	Singleton Singleton::_sint;//main执行前，该成员已经完成初始化
//};
//
//int main()
//{
//	hunger::Singleton::GetInstance();
//	hunger::Singleton::GetInstance();
//	hunger::Singleton::GetInstance();
//	return 0;
//}

//单例：懒汉
//namespace lazy
//{
//	class Singleton
//	{
//	public:
//		static Singleton* GetInstance()
//		{
//			if (_sint == nullptr)
//			{
//				_sint = new Singleton;
//			}
//			std::cout << "Get Instance" << std::endl;
//			return _sint;
//		}
//		static void DelInstance()
//		{
//			if (_sint != nullptr)
//			{
//				std::cout << "delete" << std::endl;
//				delete Singleton::_sint;
//				Singleton::_sint = nullptr;
//			}
//		}
//	protected:
//		class GC
//		{
//		public:
//			~GC()
//			{
//				Singleton::DelInstance();
//			}
//		};
//		Singleton(int x = 0, int y = 0) : _x(x), _y(y)
//		{
//			std::cout << "Create Instance" << std::endl;
//		}
//		int _x;
//		int _y;
//		static Singleton* _sint;
//		static GC _gc;
//	};
//	Singleton::GC Singleton::_gc;
//	Singleton* Singleton::_sint = nullptr;
//};
//
////int main()
////{
////
////	return 0;
////}
//
//int main()
//{
//	std::cout << "---------" << std::endl;
//	lazy::Singleton::GetInstance();
//	lazy::Singleton::GetInstance();
//	lazy::Singleton::GetInstance();
//
//	return 0;
//}

namespace lazy{
	class Singleton//C++11之前，这种设计模式无法保证线程安全
	{
	public:
		static Singleton& GetInstance()
		{
			static Singleton sint;
			return sint;
		}
	protected:
		Singleton(int x = 0, int y = 0) : _x(x), _y(y)
		{
			std::cout << "Create Instance" << std::endl;
		}
		~Singleton()
		{
			std::cout << "delete" << std::endl;
		}
		int _x;
		int _y;
	};
};


int main()
{
	lazy::Singleton::GetInstance();
	return 0;
}
